#!/usr/bin/python
# -*- coding: UTF-8 -*-


# 回归
# 神经网络可以用来模拟回归问题 (regression)，例如给下面一组数据，用一条线来对数据进行拟合，并可以预测新输入 x 的输出值

# 全连接层的每一个节点都与上一层每个节点连接，是把前一层的输出特征都综合起来，所以该层的权值参数是最多的
# 全连接的核心操作就是矩阵向量乘积 y = Wx，全连接层将权重矩阵与输入向量相乘再加上偏置
# 全连接层的作用主要就是实现分类（Classification）


import numpy as np 
np.random.seed(1337)
from keras.models import Sequential
from keras.layers import Dense
import matplotlib.pyplot as plt

# create data
X = np.linspace(-1,1,200)
np.random.shuffle(X)
Y = 0.5 * X + 2 + np.random.normal(0, 0.05, (200, ))

# plt.scatter(X,Y)
# plt.show()

X_train, Y_train = X[:160], Y[:160]
X_test, Y_test = X[160:],Y[160:]

model = Sequential()
model.add( Dense(output_dim=1, input_dim=1) )
model.compile(loss='mse',optimizer='sgd')

history = model.fit( X_train,Y_train, epochs=100,batch_size=32  )
print(history.history.keys())

plt.plot(history.history['loss']) 
plt.title('model loss')
plt.ylabel('loss')
plt.xlabel('epoch')
plt.show()



cost = model.evaluate(X_test,Y_test,batch_size=32)
print("cost",cost)

W,b = model.layers[0].get_weights()
print("  w  ",W,"   b  ",b)





print("Done")